<?php
namespace app\home\controller;

error_reporting(E_ALL ^ E_NOTICE);
use app\home\model\Recharge as UserRecharge;
use app\home\model\CreditRecord;
use app\home\model\Member;
use app\XDeode;
use think\Db;
use think\Controller;
class Hupijiao extends Base
{
    
    private $appid              = '202104230000';//测试账户，仅支持一元内支付
    private $appsecret          = '1aaf80279d361cd837a3cb486f6bca04';//测试账户，仅支持一元内支付
    private $my_plugin_id       = 'my-plugins-id';
    public function pay(){
        /**
 * 调用支付
 *
 * 实现微信、支付宝支付的接口
 * @date 2019年6月22日
 * @copyright 重庆迅虎网络有限公司
 */
require_once APP_PATH.'../'.'extend/hupijiao/api.php';

//$trade_order_id = time();//商户网站内部ID，此处time()是演示数据
$appid              = $this->appid;//测试账户，
$appsecret          = $this->appsecret;//测试账户，
$my_plugin_id =$this->my_plugin_id;

    $_var_482 = input();
    $orderNo = $this->create_order_no();
//     if(!$orderNo){
// 		return json(['code' => 0, 'msg' => '订单号不能为空']);
//     }
        //商户订单号，商户网站订单系统中唯一订单号，必填
    $out_trade_no = $orderNo;//$_var_482['WIDout_trade_no'];
     $member = $this->checkLogin();
    $userId = $member['uid'];
    if(!$userId){
		return json(['code' => 0, 'msg' => '用户ID不能为空']);
    }
    //订单名称，必填
    $subject = "充值";
    if(!$subject){
		return json(['code' => 0, 'msg' => '订单名称不能为空']);
    }
    //付款金额，必填
    $total_amount =$_REQUEST['amount'];
    //$total_amount = 0.01;
    if($total_amount<=0){
		return json(['code' => 0, 'msg' => '订单金额不合法']);
    }
    
    //商品描述，可空
    $body ="546";
    // $data['order_no'] = $orderNo;
    // $data['money'] = $total_amount;
    // $data['user_id'] = $userId;
    // $data['title'] = $subject;
    // $data['pay_type'] = 3;
    // $data['status'] = 1;
    // $data['add_time'] = time();
    // $data['product_id'] = 0;//$productId;
    // $data['name'] = $name;
    // $exist = db('order')->where('order_no="'.$orderNo.'"')->find();
    // if($exist){
    //     return json(['code' => 0, 'msg' => '订单异常']);
    // }
    // db('order')->insert($data);
    
    
    $order_no=$out_trade_no;
    $status3 = UserRecharge::addInfo([
        'uid' => $member['uid'],
        'username' => $member['username'],
        'credit2' => $total_amount,
        'realname' => '',
        'account' => $order_no,
        'pay_method'=>2,//微信
        'pay_time' => '',
        'thumbs' => '',
        'create_time' => TIMESTAMP,
        'jilu'=>date('Ymd')
    ]);


    $data=array(
        'version'   => '1.1',//固定值，api 版本，目前暂时是1.1
        'lang'       => 'zh-cn', //必须的，zh-cn或en-us 或其他，根据语言显示页面
        'plugins'   => $my_plugin_id,//必须的，根据自己需要自定义插件ID，唯一的，匹配[a-zA-Z\d\-_]+
        'appid'     => $appid, //必须的，APPID
        'trade_order_id'=> $out_trade_no, //必须的，网站订单ID，唯一的，匹配[a-zA-Z\d\-_]+
        'payment'   => 'wechat',//必须的，支付接口标识：wechat(微信接口)|alipay(支付宝接口)
        'total_fee' => $total_amount,//人民币，单位精确到分(测试账户只支持0.1元内付款)
        'title'     => $subject, //必须的，订单标题，长度32或以内
        'time'      => time(),//必须的，当前时间戳，根据此字段判断订单请求是否已超时，防止第三方攻击服务器
        'notify_url'=>  'http://daohang.mingge168168.com/home/hupijiao/notify.html', //必须的，支付成功异步回调接口
        'return_url'=> 'http://daohang.mingge168168.com/',//必须的，支付成功后的跳转地址
        'callback_url'=>'http://daohang.mingge168168.com',//必须的，支付发起地址（未支付或支付失败，系统会会跳到这个地址让用户修改支付信息）
    	'modal'=>'', //可空，支付模式 ，可选值( full:返回完整的支付网页; qrcode:返回二维码; 空值:返回支付跳转链接)
        'type'=> 'WAP',//支付宝不需要此参数
        'wap_url' => 'http://daohang.mingge168168.com',
        'wap_name' => '微信支付',
        'nonce_str' => str_shuffle(time())//必须的，随机字符串，作用：1.避免服务器缓存，2.防止安全密钥被猜测出来
    );

$hashkey =$appsecret;


$data['hash']     = \XH_Payment_Api::generate_xh_hash($data,$hashkey);
/**
 * 个人支付宝/微信官方支付，支付网关：https://api.xunhupay.com
 * 微信支付宝代收款，需提现，支付网关：https://pay.wordpressopen.com
 */
$url              = 'https://pay.xunhunet.com/payment/do.html';

try {
    $response     = \XH_Payment_Api::http_post($url, json_encode($data));
    /**
     * 支付回调数据
     * @var array(
     *      order_id,//支付系统订单ID
     *      url//支付跳转地址
     *  )
     */
    $result       = $response?json_decode($response,true):null;
    if(!$result){
        throw new Exception('Internal server error',500);
    }

    $hash         = \XH_Payment_Api::generate_xh_hash($result,$hashkey);
    if(!isset( $result['hash'])|| $hash!=$result['hash']){
        throw new Exception(__('Invalid sign!',XH_Wechat_Payment),40029);
    }

    if($result['errcode']!=0){
        throw new Exception($result['errmsg'],$result['errcode']);
    }


    $pay_url =$result['url'];
    header("Location: $pay_url");
    exit;
} catch (Exception $e) {
    echo "errcode:{$e->getCode()},errmsg:{$e->getMessage()}";
    //TODO:处理支付调用异常的情况
}
    }
    
       //生成订单号
    public  function create_order_no(){
            //生成24位唯一订单号码，格式：YYYY-MMDD-HHII-SS-NNNN,NNNN-CC，其中：YYYY=年份，MM=月份，DD=日期，HH=24格式小时，II=分，SS=秒，NNNNNNNN=随机数，CC=检查码
             @date_default_timezone_set("PRC");
             //订购日期
                $order_date = date('Y-m-d');
                //订单号码主体（YYYYMMDDHHIISSNNNNNNNN）
                $order_id_main = date('YmdHis') . rand(10000000,99999999);
                //订单号码主体长度
                $order_id_len = strlen($order_id_main);
                $order_id_sum = 0;
                for($i=0; $i<$order_id_len; $i++){
                                $order_id_sum += (int)(substr($order_id_main,$i,1));
                }
                //唯一订单号码（YYYYMMDDHHIISSNNNNNNNNCC）
                $order_id = $order_id_main . str_pad((100 - $order_id_sum % 100) % 100,2,'0',STR_PAD_LEFT);
                return $order_id;
    }
    
    public function notify(){
        /**
         * 支付成功异步回调接口
         *
         * 当用户支付成功后，支付平台会把订单支付信息异步请求到本接口(最多5次)
         *
         * @date 2017年3月13日
         * @copyright 重庆迅虎网络有限公司
         */
        require_once APP_PATH.'../'.'extend/hupijiao/api.php';
        
        
        /**
         * 回调数据
         * @var array(
         *       'trade_order_id'，商户网站订单ID
                 'total_fee',订单支付金额
                 'transaction_id',//支付平台订单ID
                 'order_date',//支付时间
                 'plugins',//自定义插件ID,与支付请求时一致
                 'status'=>'OD'//订单状态，OD已支付，WP未支付
         *   )
         */
        
        $appid              = $this->appid;//测试账户，仅支持一元内支付
        $appsecret          = $this->appsecret;//测试账户，仅支持一元内支付
        $my_plugin_id       = $this->my_plugin_id;
        
        $data = $_POST;
        
        foreach ($data as $k=>$v){
            $data[$k] = stripslashes($v);
        }
        if(!isset($data['hash'])||!isset($data['trade_order_id'])){
           echo 'failed';exit;
        }
        
        //自定义插件ID,请与支付请求时一致
        if(isset($data['plugins'])&&$data['plugins']!=$my_plugin_id){
            echo 'failed';exit;
        }
        
        //APP SECRET
        $appkey =$appsecret;
        $hash =\XH_Payment_Api::generate_xh_hash($data,$appkey);
        if($data['hash']!=$hash){
            //签名验证失败
            echo 'failed';exit;
        }
        
        //商户订单ID
        $trade_order_id =$data['trade_order_id'];
        
        if($data['status']=='OD'){
            /************商户业务处理******************/
            //TODO:此处处理订单业务逻辑,支付平台会多次调用本接口(防止网络异常导致回调失败等情况)
            //     请避免订单被二次更新而导致业务异常！！！
            //     if(订单未处理){
            //         处理订单....
            //      }
        
        //     $order = db('order')->where('order_no', $trade_order_id)->find();
            
        // 	if($data['total_fee'] == $order['money'] && $order['status'] == 1){
        // 	    $up['status'] = 2;
        // 	    $up['pay_time'] = time();
        // 	    db('order')->where('id='.$order['id'])->update($up);
        // 	    $user = db('user')->where('id', $order['user_id'])->find();
        // 	    db('user')->where('id', $order['user_id'])->update(['money' => round($user['money']+$data['total_fee'],2)]);
        // 	    payedDetail($order['user_id'], $order['name']);
        // 	}
            
            //$member = $this->checkLogin();
             Db::startTrans();
    	   
    	    $rdata = db('recharge')->where('account',$trade_order_id)->find();
            if(!empty($rdata)){
                $update = [];
                $update['status'] = 1;
                $update['note'] = '';
                $update['pay_time'] = date('Y-m-d H:i:s', TIMESTAMP);
                $update['update_time'] = TIMESTAMP;
                $status = UserRecharge::updateInfoById($rdata['id'], $update);
                if(!$status){
                    Db::rollback();
                    return false;
                }
        
                $credit2 = $rdata['credit2'];
                $status1 = Member::updateCreditById($rdata['uid'], 0, $credit2);
                if(!$status1){
                    Db::rollback();
                    return false;
                }
                $status2 = CreditRecord::addInfo([
                    'uid' => $rdata['uid'],
                    'type' => 'credit2',
                    'num' => $credit2,
                    'title' => '余额充值',
                    'remark' => "微信充值金额：{$credit2}。",
                    'create_time' => TIMESTAMP
                ]);
                if(!$status2){
                    Db::rollback();
                    return false;
                }
        
                Db::commit();
            }
            
        		
            //....
            //...
            /*************商户业务处理 END*****************/
        }else{
            //处理未支付的情况
        }
        
        //以下是处理成功后输出，当支付平台接收到此消息后，将不再重复回调当前接口
        echo 'success';
        exit;
    }
}